<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Ogre_glTF: C:/YbalridSoftware/AnnwvynSDK64/Ogre_glTF/src/Ogre_glTF_textureImporter.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(initResizable);
/* @license-end */</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Ogre_glTF
   </div>
   <div id="projectbrief">glTF import library for Ogre</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('_ogre__gl_t_f__texture_importer_8cpp_source.html','');});
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Ogre_glTF_textureImporter.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="preprocessor">#include &quot;Ogre_glTF_textureImporter.hpp&quot;</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="preprocessor">#include &quot;Ogre_glTF_common.hpp&quot;</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="preprocessor">#include &lt;OgreLogManager.h&gt;</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="preprocessor">#include &lt;OgreTextureManager.h&gt;</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="preprocessor">#include &lt;OgreTexture.h&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &lt;OgreImage.h&gt;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &lt;OgreHardwarePixelBuffer.h&gt;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &lt;OgreColourValue.h&gt;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;OgreRoot.h&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;OgreRenderTarget.h&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespace_ogre__gl_t_f.html">Ogre_glTF</a>;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment">//TODO pack the loaded textures in texture arrays (TEX_TYPE_2D_ARRAY) to optimize the way textures are binded to the slots of an HlmsPbsDatablock.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment">//TODO rethink the oder of operations while loading texture. Some of them need to be interpreted differently for they usage (MetalRoughMap needs to be separated in two greyscale map, NormalMap need SNORM reformating). Knowing what the material is doing with them will help avoid uncessesary resource usage and load time.</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment">//TODO planned refactoring : pixel format selection code needs to be put into it&#39;s own method</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">//TODO planned refactoring : Loading of texture via OgreImage needs to be put into it&#39;s own method</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment">//TODO investicate if HardwarePixelBuffer is going to be deprecated. Why is it in the Ogre::v1 namespace? What will happen in Ogre 2.2&#39;s &quot;texture refactor&quot;?</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="keywordtype">size_t</span> textureImporter::id { 0 };</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="keywordtype">void</span> textureImporter::loadTexture(<span class="keyword">const</span> tinygltf::Texture&amp; texture)</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;{</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;    <span class="keyword">auto</span> textureManager = Ogre::TextureManager::getSingletonPtr();</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span>&amp; image   = model.images[texture.source];</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> name     = <span class="stringliteral">&quot;glTF_texture_&quot;</span> + image.name + std::to_string(<span class="keywordtype">id</span>) + std::to_string(texture.source);</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;    <span class="keyword">auto</span> OgreTexture = textureManager-&gt;getByName(name);</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;    <span class="keywordflow">if</span>(OgreTexture)</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;    {</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;        <span class="comment">//OgreLog(&quot;Texture &quot; + name + &quot; already loaded in Ogre::TextureManager&quot;);</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    }</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    OgreLog(<span class="stringliteral">&quot;Loading texture image &quot;</span> + name);</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> pixelFormat = [&amp;] {</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;        <span class="keywordflow">if</span>(image.component == 3) <span class="keywordflow">return</span> Ogre::PF_BYTE_RGB;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;        <span class="keywordflow">if</span>(image.component == 4) <span class="keywordflow">return</span> Ogre::PF_BYTE_RGBA;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;        <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Can get &quot;</span> + name + <span class="stringliteral">&quot;pixel format&quot;</span>);</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;        <span class="comment">//TODO do this properly. Right now it is guesswork</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;        OgreLog(<span class="stringliteral">&quot;unrecognized pixel format from tinygltf image&quot;</span>);</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    }();</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    <span class="keywordflow">if</span>(image.image.size() / image.component == image.width * image.height) { OgreLog(<span class="stringliteral">&quot;It looks like the image.component field and the image size does match&quot;</span>); }</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    {</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;        OgreLog(<span class="stringliteral">&quot;I have no idea what is going on with the image format&quot;</span>);</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    }</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;    Ogre::Image OgreImage;</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    <span class="comment">//The OgreImage class *can* take ownership of the pointer to the data and automatically delete it.</span></div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    <span class="comment">//We *don&#39;t* want that. 6th argument needs to be set to false to prevent that.</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;    <span class="comment">//The rest of the funciton is not modifying the model.images[x].image object. We get the image as a const ref.</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    <span class="comment">//In order to keep the rest of this code const correct, and knowing that the &quot;autoDelete&quot; is specifically</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="comment">//set to `false`, we&#39;re casting away const on the pointer to get the image data.</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    OgreImage.loadDynamicImage(const_cast&lt;Ogre::uchar*&gt;(image.image.data()), image.width, image.height, 1, pixelFormat, <span class="keyword">false</span>);</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    OgreTexture = textureManager-&gt;createManual(name,</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;                                               Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;                                               Ogre::TextureType::TEX_TYPE_2D_ARRAY,</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;                                               image.width,</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;                                               image.height,</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;                                               1,</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;                                               1,</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;                                               pixelFormat,</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;                                               Ogre::TU_DEFAULT,</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;                                               <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;                                               isHardwareGammaEnabled());</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    OgreTexture-&gt;loadImage(OgreImage);</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    loadedTextures.insert({ texture.source, OgreTexture });</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;}</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;<span class="keywordtype">bool</span> textureImporter::isHardwareGammaEnabled()<span class="keyword"> const</span></div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> renderSystem = Ogre::Root::getSingleton().getRenderSystem();</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;    <span class="comment">//don&#39;t bother to check render targets for gamma if render system doesn&#39;t have the option enabled</span></div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    {</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span> renderSystemGammaConversionConfigOption = renderSystem-&gt;getConfigOptions().at(<span class="stringliteral">&quot;sRGB Gamma Conversion&quot;</span>);</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;        <span class="keywordflow">if</span>(renderSystemGammaConversionConfigOption.currentValue != <span class="stringliteral">&quot;Yes&quot;</span>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    }</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    <span class="keywordflow">catch</span>(<span class="keyword">const</span> std::exception&amp; e)</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    {</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;        OgreLog(<span class="stringliteral">&quot;It appears that render system doesn&#39;t know if it uses srgb gamma conversion? How is that possible? We&#39;re going to check the render targets &quot;</span></div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;                <span class="stringliteral">&quot;anyway&quot;</span>);</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    }</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    <span class="comment">//Check if any render target has the option, and if so, return true</span></div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    <span class="keyword">auto</span> renderTargetIt = renderSystem-&gt;getRenderTargetIterator();</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    <span class="keywordflow">do</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    {</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;        <span class="keywordflow">if</span>(renderTargetIt.current()-&gt;second-&gt;isHardwareGammaEnabled()) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;        renderTargetIt.moveNext();</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;    } <span class="keywordflow">while</span>(renderTargetIt.current() != renderTargetIt.end());</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;}</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="class_ogre__gl_t_f_1_1texture_importer.html#adb7e5a712efa692efe8f1fe5ac6c3748">  106</a></span>&#160;<a class="code" href="class_ogre__gl_t_f_1_1texture_importer.html#adb7e5a712efa692efe8f1fe5ac6c3748">textureImporter::textureImporter</a>(tinygltf::Model&amp; input) : model { input } { <span class="keywordtype">id</span>++; }</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="class_ogre__gl_t_f_1_1texture_importer.html#a647b3d6ddf7d512607d03178ce31f63c">  108</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="class_ogre__gl_t_f_1_1texture_importer.html#a647b3d6ddf7d512607d03178ce31f63c">textureImporter::loadTextures</a>()</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;{</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    <span class="keywordflow">for</span>(<span class="keyword">const</span> <span class="keyword">auto</span>&amp; texture : model.textures) { loadTexture(texture); }</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;}</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="class_ogre__gl_t_f_1_1texture_importer.html#a85af2b1ab4eb724816dc8903da867852">  113</a></span>&#160;Ogre::TexturePtr <a class="code" href="class_ogre__gl_t_f_1_1texture_importer.html#a85af2b1ab4eb724816dc8903da867852">textureImporter::getTexture</a>(<span class="keywordtype">int</span> glTFTextureSourceID)</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;{</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    <span class="keyword">auto</span> texture = loadedTextures.find(glTFTextureSourceID);</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    <span class="keywordflow">if</span>(texture == std::end(loadedTextures)) <span class="keywordflow">return</span> {};</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    <span class="keywordflow">return</span> texture-&gt;second;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;}</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="class_ogre__gl_t_f_1_1texture_importer.html#af3d16f304458fa4c688ed69d1ef35c5a">  121</a></span>&#160;Ogre::TexturePtr <a class="code" href="class_ogre__gl_t_f_1_1texture_importer.html#af3d16f304458fa4c688ed69d1ef35c5a">textureImporter::generateGreyScaleFromChannel</a>(<span class="keywordtype">int</span> gltfTextureSourceID, <span class="keywordtype">int</span> channel)</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;{</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    <span class="keyword">auto</span> textureManager = Ogre::TextureManager::getSingletonPtr();</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span>&amp; image   = model.images[gltfTextureSourceID];</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    assert(channel &lt; 4 &amp;&amp; channel &gt;= 0 <span class="comment">/*, &quot;Channel needs to be between 0 and 3&quot;*/</span>);</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> name = <span class="stringliteral">&quot;glTF_texture_&quot;</span> + image.name + std::to_string(<span class="keywordtype">id</span>) + std::to_string(gltfTextureSourceID) + <span class="stringliteral">&quot;_greyscale_channel&quot;</span> + std::to_string(channel);</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;    <span class="keyword">auto</span> texture = textureManager-&gt;getByName(name);</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <span class="keywordflow">if</span>(texture)</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    {</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;        <span class="comment">//OgreLog(&quot;texture &quot; + name + &quot;Already loaded in Ogre::TextureManager&quot;);</span></div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;        <span class="keywordflow">return</span> texture;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    }</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;    OgreLog(<span class="stringliteral">&quot;Can&#39;t find texure &quot;</span> + name + <span class="stringliteral">&quot;. Generating it from glTF&quot;</span>);</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    assert(channel &lt; image.component);</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="comment">//Greyscale the image by putting all channel to the same value, ignoring alpha</span></div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    std::vector&lt;Ogre::uchar&gt; imageData(image.image.size());</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> pixelCount { imageData.size() / image.component };</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i { 0 }; i &lt; pixelCount; i++) <span class="comment">//for each pixel</span></div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    {</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;        <span class="comment">//Get the channel that has the value</span></div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        Ogre::uchar grey = image.image[(i * image.component) + channel];</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;        <span class="comment">//Turn pixel at this specific shade of grey</span></div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> c { 0 }; c &lt; 3; c++) imageData[i * image.component + c] = grey;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;        <span class="comment">//If there&#39;s an alpha channel, put it to 1.0f (255)</span></div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;        <span class="keywordflow">if</span>(image.component &gt; 3) imageData[i * image.component + 3] = 255;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    }</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> pixelFormat = [&amp;] {</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;        <span class="keywordflow">if</span>(image.component == 3) <span class="keywordflow">return</span> Ogre::PF_BYTE_RGB;</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;        <span class="keywordflow">if</span>(image.component == 4) <span class="keywordflow">return</span> Ogre::PF_BYTE_RGBA;</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;        <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Can get &quot;</span> + name + <span class="stringliteral">&quot;pixel format&quot;</span>);</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;        <span class="comment">//TODO do this properly. Right now it is guesswork</span></div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;        OgreLog(<span class="stringliteral">&quot;unrecognized pixel format from tinygltf image&quot;</span>);</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;    }();</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    Ogre::Image OgreImage;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    Ogre::TexturePtr OgreTexture;</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;    <span class="comment">//TODO refactor this</span></div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <span class="comment">//The OgreImage class *can* take ownership of the pointer to the data and automatically delete it.</span></div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="comment">//We *don&#39;t* want that. 6th argument needs to be set to false to prevent that.</span></div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    <span class="comment">//The rest of the funciton is not modifying the model.images[x].image object. We get the image as a const ref.</span></div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    <span class="comment">//In order to keep the rest of this code const correct, and knowing that the &quot;autoDelete&quot; is specifically</span></div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;    <span class="comment">//set to `false`, we&#39;re casting away const on the pointer to get the image data.</span></div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;    OgreImage.loadDynamicImage(imageData.data(), image.width, image.height, 1, pixelFormat, <span class="keyword">false</span>);</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;    OgreTexture = textureManager-&gt;createManual(name,</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;                                               Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;                                               Ogre::TextureType::TEX_TYPE_2D_ARRAY,</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;                                               image.width,</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;                                               image.height,</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;                                               1,</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;                                               1,</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;                                               pixelFormat,</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;                                               Ogre::TU_DEFAULT,</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;                                               <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;                                               isHardwareGammaEnabled());</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;    OgreTexture-&gt;loadImage(OgreImage);</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;    <span class="keywordflow">return</span> OgreTexture;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;}</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="class_ogre__gl_t_f_1_1texture_importer.html#a2ca2141a31ee86e9ad699ef43200eb4d">  192</a></span>&#160;Ogre::TexturePtr <a class="code" href="class_ogre__gl_t_f_1_1texture_importer.html#a2ca2141a31ee86e9ad699ef43200eb4d">textureImporter::getNormalSNORM</a>(<span class="keywordtype">int</span> gltfTextureSourceID)</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;{</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;    <span class="keyword">auto</span> textureManager = Ogre::TextureManager::getSingletonPtr();</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span>&amp; image   = model.images[gltfTextureSourceID];</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> name     = <span class="stringliteral">&quot;glTF_texture_&quot;</span> + image.name + std::to_string(<span class="keywordtype">id</span>) + std::to_string(gltfTextureSourceID) + <span class="stringliteral">&quot;_NormalFixed&quot;</span>;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    <span class="keyword">auto</span> texture = textureManager-&gt;getByName(name);</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    <span class="keywordflow">if</span>(texture)</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    {</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;        <span class="comment">//OgreLog(&quot;texture &quot; + name + &quot;Already loaded in Ogre::TextureManager&quot;);</span></div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;        <span class="keywordflow">return</span> texture;</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    }</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    OgreLog(<span class="stringliteral">&quot;Can&#39;t find texure &quot;</span> + name + <span class="stringliteral">&quot;. Generating it from glTF&quot;</span>);</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> pixelFormat = [&amp;] {</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;        <span class="keywordflow">if</span>(image.component == 3) <span class="keywordflow">return</span> Ogre::PF_BYTE_RGB;</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;        <span class="keywordflow">if</span>(image.component == 4) <span class="keywordflow">return</span> Ogre::PF_BYTE_RGBA;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;        <span class="comment">//TODO do this properly. Right now it is guesswork</span></div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;        OgreLog(<span class="stringliteral">&quot;unrecognized pixel format from tinygltf image&quot;</span>);</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;        <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Can get &quot;</span> + name + <span class="stringliteral">&quot;pixel format&quot;</span>);</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    }();</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    <span class="keyword">const</span> <span class="keyword">auto</span> pixelFormatSnorm = [&amp;] {</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;        <span class="keywordflow">if</span>(image.component == 3) <span class="keywordflow">return</span> Ogre::PF_R8G8B8_SNORM;</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        <span class="keywordflow">if</span>(image.component == 4) <span class="keywordflow">return</span> Ogre::PF_R8G8B8A8_SNORM;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;        <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Can get &quot;</span> + name + <span class="stringliteral">&quot;pixel format&quot;</span>);</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;    }();</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    Ogre::TexturePtr OgreTexture = textureManager-&gt;createManual(name,</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;                                                                Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;                                                                Ogre::TextureType::TEX_TYPE_2D_ARRAY,</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;                                                                image.width,</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;                                                                image.height,</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;                                                                1,</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;                                                                1,</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;                                                                pixelFormatSnorm,</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;                                                                Ogre::TU_DEFAULT,</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;                                                                <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;                                                                isHardwareGammaEnabled());</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    <span class="keyword">auto</span> pixels = OgreTexture-&gt;getBuffer()-&gt;lock({ 0, 0, unsigned(image.width), unsigned(image.height) }, <span class="comment">//PixelBox that take the whole image</span></div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;                                                 Ogre::v1::HardwareBuffer::LockOptions::HBL_NORMAL);</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="comment">//This loop convert BGR to RGB image data while also putting the value in the SNORM range [-1.0; +1.0]</span></div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> y { 0 }; y &lt; image.height; y++)</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> x { 0 }; x &lt; image.width; x++)</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;            pixels.setColourAt(Ogre::ColourValue(2.0f * (<span class="keywordtype">float</span>(image.image[image.component * (y * image.width + x) + 2]) / 255.0f) - 1.0f, <span class="comment">//R to B</span></div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;                                                 2.0f * (<span class="keywordtype">float</span>(image.image[image.component * (y * image.width + x) + 1]) / 255.0f) - 1.0f, <span class="comment">//G to G</span></div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;                                                 2.0f * (<span class="keywordtype">float</span>(image.image[image.component * (y * image.width + x) + 0]) / 255.0f) - 1.0f, <span class="comment">//B to R</span></div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;                                                 1.0f),</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;                               x,</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;                               y,</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;                               0);</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    OgreTexture-&gt;getBuffer()-&gt;unlock();</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    <span class="keywordflow">return</span> OgreTexture;</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;}</div><div class="ttc" id="class_ogre__gl_t_f_1_1texture_importer_html_a85af2b1ab4eb724816dc8903da867852"><div class="ttname"><a href="class_ogre__gl_t_f_1_1texture_importer.html#a85af2b1ab4eb724816dc8903da867852">Ogre_glTF::textureImporter::getTexture</a></div><div class="ttdeci">Ogre::TexturePtr getTexture(int glTFTextureSourceID)</div><div class="ttdef"><b>Definition:</b> <a href="_ogre__gl_t_f__texture_importer_8cpp_source.html#l00113">Ogre_glTF_textureImporter.cpp:113</a></div></div>
<div class="ttc" id="class_ogre__gl_t_f_1_1texture_importer_html_a2ca2141a31ee86e9ad699ef43200eb4d"><div class="ttname"><a href="class_ogre__gl_t_f_1_1texture_importer.html#a2ca2141a31ee86e9ad699ef43200eb4d">Ogre_glTF::textureImporter::getNormalSNORM</a></div><div class="ttdeci">Ogre::TexturePtr getNormalSNORM(int gltfTextureSourceID)</div><div class="ttdef"><b>Definition:</b> <a href="_ogre__gl_t_f__texture_importer_8cpp_source.html#l00192">Ogre_glTF_textureImporter.cpp:192</a></div></div>
<div class="ttc" id="class_ogre__gl_t_f_1_1texture_importer_html_a647b3d6ddf7d512607d03178ce31f63c"><div class="ttname"><a href="class_ogre__gl_t_f_1_1texture_importer.html#a647b3d6ddf7d512607d03178ce31f63c">Ogre_glTF::textureImporter::loadTextures</a></div><div class="ttdeci">void loadTextures()</div><div class="ttdoc">Load all the textures in the model. </div><div class="ttdef"><b>Definition:</b> <a href="_ogre__gl_t_f__texture_importer_8cpp_source.html#l00108">Ogre_glTF_textureImporter.cpp:108</a></div></div>
<div class="ttc" id="class_ogre__gl_t_f_1_1texture_importer_html_adb7e5a712efa692efe8f1fe5ac6c3748"><div class="ttname"><a href="class_ogre__gl_t_f_1_1texture_importer.html#adb7e5a712efa692efe8f1fe5ac6c3748">Ogre_glTF::textureImporter::textureImporter</a></div><div class="ttdeci">textureImporter(tinygltf::Model &amp;input)</div><div class="ttdef"><b>Definition:</b> <a href="_ogre__gl_t_f__texture_importer_8cpp_source.html#l00106">Ogre_glTF_textureImporter.cpp:106</a></div></div>
<div class="ttc" id="namespace_ogre__gl_t_f_html"><div class="ttname"><a href="namespace_ogre__gl_t_f.html">Ogre_glTF</a></div><div class="ttdef"><b>Definition:</b> <a href="_ogre__gl_t_f__internal__utils_8hpp_source.html#l00005">Ogre_glTF_internal_utils.hpp:5</a></div></div>
<div class="ttc" id="class_ogre__gl_t_f_1_1texture_importer_html_af3d16f304458fa4c688ed69d1ef35c5a"><div class="ttname"><a href="class_ogre__gl_t_f_1_1texture_importer.html#af3d16f304458fa4c688ed69d1ef35c5a">Ogre_glTF::textureImporter::generateGreyScaleFromChannel</a></div><div class="ttdeci">Ogre::TexturePtr generateGreyScaleFromChannel(int gltfTextureSourceID, int channel)</div><div class="ttdef"><b>Definition:</b> <a href="_ogre__gl_t_f__texture_importer_8cpp_source.html#l00121">Ogre_glTF_textureImporter.cpp:121</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><b>Ogre_glTF_textureImporter.cpp</b></li>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
  </ul>
</div>
</body>
</html>
